package com.qf.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.qf.pojo.Customer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 * 熔断器   断路器
 * @author lixu
 */
@RestController
@RequestMapping("/hystrix")
public class HystrixController {




    /**
     * 根据ID查询一个对象
     */
    @GetMapping("/findById")
    @HystrixCommand(
            fallbackMethod = "findByIdFallback",
            commandProperties = {
                    //线程隔离 THREAD：熔断器的线程池      SEMAPHORE：信号量  Tomcat服务器的线程池
                    //@HystrixProperty(name = "execution.isolation.strategy",value = "SEMAPHORE"),
                    @HystrixProperty(name = "execution.isolation.strategy",value = "THREAD"),//默认的
                    //当前线程执行时间不允许超过1s  如果超过 我们也视认为出问题了 走降级处理
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000"),
                    //（默认10s秒中之内请求数）
                    //断路器  开启断路器 默认就是开着的
                    @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
                    //失败阈值的总请求数
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "70"),
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000")
            }

    )//断路器先进行熔断 再降级处理
    public Customer findById1(Integer id){

        System.out.println("1:接收请求：" + Thread.currentThread().getName());

   /*     try {
            Thread.sleep(1100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        //出问题
        if(id == 1){
            int i = 1/0;
        }
        //正常返回
        return new Customer(id,"gp14");
    }

    /**
     * 降级处理方法
     * 1:接收请求：         http-nio-9002-exec-1
     * 2:降级处理线程名称：  http-nio-9002-exec-1
     *
     *  线程池原理： 核心参数
     *
     *    1、核心线程数  5
     *    2、最大线程数 10
     *    3、非核心线程= 最大线程数-核心线程数  存活时间
     *    4、单位
     *    5、队列  长度是5
     *    6、工厂
     *    7、拒绝策略
     *
     *    一、工厂创建线程池  0个
     *    二、向线程池申请线程   1~5  核心线程数未满   创建新的线程 1 2 3 4 5
     *    三、 6~10 在队列中进行排队
     *    四、 11~15 此时队列中已经满了  核心线程数也满了  判断最大线程数未满 11 ~15
     *    五、 16~20  执行拒绝策略
     *
     *
     *
     * @param id
     * @return
     */
    public Customer findByIdFallback(Integer id){
        System.out.println("2:降级处理线程名称：" + Thread.currentThread().getName());
        //正常返回
        return new Customer(id,"搜索微服务中降级处理的结果");
    }
}
